package com.tiantian.datajpa.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;

/**
 * 驼峰util Copyright (c) 2015,重庆扬讯软件技术有限公司<br>
 * All rights reserved.<br>
 *
 * 文件名称：HumpUtil.java<br>
 * 摘要：简要描述本文件的内容<br>
 * -------------------------------------------------------<br>
 * 原作者：王强<br>
 * 完成日期：2015年5月19日<br>
 */
public class HumpUtil {
	/**
	 * key转驼峰格式
	 * 
	 * @date 2015年5月19日 上午10:31:14
	 * @author 王强
	 * @param datas
	 * @return
	 */
	public static final List<Map<String, Object>> parseListMapToHump(List<Map<String, Object>> datas) {
		if (datas == null) {
			return null;
		}
		List<Map<String, Object>> ret = new ArrayList<Map<String, Object>>(datas.size());
		for (Map<String, Object> data : datas) {
			ret.add(parseMapToHump(data));
		}
		return ret;
	}

	/**
	 * key转驼峰格式
	 * 
	 * @date 2015年5月19日 上午10:31:29
	 * @author 王强
	 * @param data
	 * @return
	 */
	public static final Map<String, Object> parseMapToHump(Map<String, Object> data) {
		if (data == null) {
			return null;
		}
		Map<String, Object> ret = new HashMap<String, Object>();
		for (Map.Entry<String, Object> entity : data.entrySet()) {
			ret.put(humpName(entity.getKey()), entity.getValue());
		}
		return ret;
	}

	/**
	 * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空，则返回空字符串。</br>
	 * 例如：HELLO_WORLD->HelloWorld
	 * 
	 * @param name
	 *            转换前的下划线大写方式命名的字符串
	 * @return 转换后的驼峰式命名的字符串
	 */
	public static String humpName(String name) {
		StringBuilder result = new StringBuilder();
		// 快速检查
		if (StringUtils.isBlank(name)) {
			// 没必要转换
			return "";
		} else if (!name.contains("_")) {
			// 不含下划线
			return name.toLowerCase();
		}
		// 用下划线将原始字符串分割
		String camels[] = name.split("_");
		for (String camel : camels) {
			// 跳过原始字符串中开头、结尾的下换线或双重下划线
			if (camel.isEmpty()) {
				continue;
			}
			// 处理真正的驼峰片段
			if (result.length() == 0) {
				// 第一个驼峰片段，全部字母都小写
				result.append(camel.toLowerCase());
			} else {
				// 其他的驼峰片段，首字母大写
				result.append(camel.substring(0, 1).toUpperCase());
				result.append(camel.substring(1).toLowerCase());
			}
		}
		return result.toString();
	}
}
